#ifndef WEBRTC_HPP_
#define WEBRTC_HPP_

#include <nlohmann/json.hpp>
#include <rtc/rtc.hpp>
#include <unordered_map>
#include <memory>
#include <string>
#include <functional>
#include "dart_api_dl.h"
#include "dartport.h"
// #include <random>

template <class T1, class T2>
using umap = std::unordered_map<T1, T2>;


using std::string;
using std::shared_ptr;
// std::string randomId(size_t length);
template <class T> std::weak_ptr<T> make_weak_ptr(std::shared_ptr<T> ptr) { return ptr; }
class WebRTC
{
private:
    string localId_;
    // 对端链接
    umap<string, std::shared_ptr<rtc::PeerConnection>> peerConnectionsMap_;
    // 一个连接可以有多个数据通道数据通道
    umap<string, rtc::DataChannel> dataChannelsMap_;

    umap<rtc::PeerConnection*, DartPort*> pcDartPortMap_;
    umap<rtc::DataChannel*, DartPort*> dcDartPortMap_;
    // pc 和 dc 都需要与dart通信，所以需要websocket_dart
    // 用于与密令服务器通信
    std::function<void()> onWsOpen_ = nullptr;
    std::function<void()> onWsClose_ = nullptr;
    std::function<void(rtc::message_variant)> onWsMessage_ = nullptr;

    // 建立连接是一个异步过程，需要等待连接建立完成
    DartPort *ws_ = nullptr;  // 用于与dart通信的端口
    std::future<int> wsFuture_; // 用于等待websocket连接建立完成

public:
    WebRTC();
    ~WebRTC();

    void setWsOpenCb(std::function<void()> cb) { onWsOpen_ = cb; }
    void setWsCloseCb(std::function<void()> cb) { onWsClose_ = cb; }
    // void setWsMessageCb(std::function<void(rtc::message_variant)> cb) { onWsMessage_ = cb; }

    // 创建对端连接， 交换sdp和candidate 由dort端调用，并传递过来port, 用于与dart通信
    rtc::PeerConnection* createPeerConnection(string remoteId, Dart_Port port);

private:
    // 当ws建立连接，要和服务器建立连接
    void onWsOnMessage(std::string data) {
        
    }
    void onDataChannel_(shared_ptr<rtc::DataChannel> dc, string id, Dart_Port port);
};









#endif